home *** CD-ROM | disk | FTP | other *** search
/ Aminet 31 / Aminet 31 (1999)(Schatztruhe)[!][Jun 1999].iso / Aminet / dev / c / GAPLib.lha / GAPLib_Beta / wizards / Conjurer.c < prev    next >
C/C++ Source or Header  |  1999-04-22  |  35KB  |  1,658 lines

  1. /*
  2.  * The GAP Conjurer (C)1999 Peter Bengtsson
  3.  *
  4.  * History:
  5.  *
  6.  *        22/4-1999: v1.0
  7.  *
  8.  *
  9.  */
  10.  
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <ctype.h>
  14. #include <string.h>
  15. #include <time.h>
  16. #include <sys/stat.h>
  17. #include <errno.h>
  18.  
  19. #include "data/bs_c.c"
  20. #include "data/bm_c.c"
  21. #include "data/bv_c.c"
  22. #include "data/sk_c.c"
  23. #include "data/report_h.c"
  24. #include "data/report_c.c"
  25. #include "data/mk.c"
  26.  
  27. const char *__v__="$VER: GAP-Conjurer 1.0 (22.4.99) ©1999 Peter Bengtsson";
  28.  
  29. /* #define    CLEAR    "\x1b" "c"  */
  30.  
  31. #define    CLEAR    "\x1b[H\x1b[J"
  32.  
  33. #define    TF(x)    ((x)?"TRUE":"FALSE")
  34.  
  35. #define    DIR_SEPARATOR    '/'
  36.  
  37. #ifdef    AMIGA
  38. #define    CURRENT_DIR    ""
  39. #else
  40. #define    CURRENT_DIR    "."
  41. #endif
  42.  
  43. #define    Rnd(a)    (rand()%a)
  44. #define    InitRand(a)    srand((unsigned int)a)
  45.  
  46. #define    YES    'Y'
  47. #define    NO        'N'
  48.  
  49. #define    DEFY    "[Y/n]"
  50. #define    DEFN    "[y/N]"
  51.  
  52. #define    MN_IGN    0
  53. #define    MN_STR    1
  54. #define    MN_INT    2
  55. #define    MN_BOL    3
  56.  
  57. #define    WIZFLG_PLOT        (1<<0)
  58. #define    WIZFLG_PSPLOT    (1<<1)
  59. #define    WIZFLG_MPASS    (1<<2)
  60.  
  61. #define    DEF_GENERATIONS    10
  62.  
  63. #define    DEF_BRVLEN    3
  64.  
  65. #define    DEF_NAME    "Manhattan"
  66.  
  67. #define    NUM_DEFNAMES    11
  68.  
  69. char    *includes[] = {
  70.     "stdio",
  71.     "stdlib",
  72.     "string",
  73.     "math",
  74.     "time",
  75.     "GAP",
  76.     NULL
  77. };
  78.  
  79. char    *SelectNames[] = {
  80.     "Double Random",
  81.     "Fitness Proportionate",
  82.     "Sigma Scaled",
  83.     "Tournament",
  84.     "Inorder",
  85.     "Boltzmann",
  86.     "Universal",
  87.     NULL
  88. };
  89.  
  90. char    *RepDefs[] = {
  91.     "AVERAGE",
  92.     "MEDIAN",
  93.     "TYPECOUNT",
  94.     "MAX",
  95.     "MIN",
  96.     "STDDEV"
  97. };
  98.  
  99. char *RepNames[] = {
  100.     "Average",
  101.     "Median",
  102.     "Typecount",
  103.     "Maximum",
  104.     "Minimum",
  105.     "Standard Deviation"
  106. };
  107.  
  108. char *RepExts[] = {
  109.     "avg",
  110.     "med",
  111.     "typ",
  112.     "max",
  113.     "min",
  114.     "dev"
  115. };
  116.  
  117. char    *SelectDefs[] = {
  118.     "DRANDOM",
  119.     "FITPROP",
  120.     "SIGMA",
  121.     "TOURNAMENT",
  122.     "INORDER",
  123.     "TEMPERATURE",
  124.     "UNIVERSAL"
  125. };
  126.  
  127. char    *CrossoverNames[] = {
  128.     "Singlepoint",
  129.     "Multipoint",
  130.     "Custom",
  131.     NULL
  132. };
  133.  
  134. char    *InitNames[] = {
  135.     "Random init",
  136.     "Zero init",
  137.     "Custom init",
  138.     NULL
  139. };
  140.  
  141. char    *CLNames[] = {
  142.     "None",
  143.     "Normal",
  144.     "Verbose",
  145.     "Irritating",
  146.     "Overwhelming",
  147.     NULL
  148. };
  149.  
  150. char    **CLMenu = CLNames;
  151.  
  152. #define    PTYPE_Bitstring    0
  153. #define    PTYPE_Bitmatrix    1
  154. #define    PTYPE_BRVector        2
  155. #define    PTYPE_Custom        3
  156.  
  157. char    *GenomeNames[] = {
  158.     "Bitstring",
  159.     "Bitmatrix",
  160.     "Bounded double vector",
  161.     "Custom",
  162.     NULL
  163. };
  164.  
  165. char    **GenomeMenu = GenomeNames;
  166.  
  167. char    *DefNames[] = {
  168.     "Tourist",
  169.     "Hacker",
  170.     "Gnome",
  171.     "Borg",
  172.     "Bug",
  173.     "Zool",
  174.     "Ghost",
  175.     "Hobbit",
  176.     "Haddock",
  177.     "Dinosaur",
  178.     "Polyphant",
  179.     NULL
  180. };
  181.  
  182. struct VDisp {
  183.     int    Type;
  184.     long    Val;
  185. };
  186.  
  187. char    *Menu1[] = {
  188.     "Project parameters",
  189.     "Population parameters",
  190.     "Make project",
  191.     "Save configuration",
  192.     "Load configuration",
  193.     "Quit",
  194.     NULL
  195. };
  196.  
  197. char    *PrParms[] = {
  198.     "Project name",
  199.     "No. of populations",
  200.     "Comment level",
  201.     "Multiple sourcefiles",
  202.     "GNUPlot script",
  203.     "PostScript plots",
  204.     "Exit",
  205.     NULL
  206. };
  207.  
  208. struct VDisp PrVals[] = {
  209.     {MN_STR,0},
  210.     {MN_INT,0},
  211.     {MN_STR,0},
  212.     {MN_BOL,0},
  213.     {MN_BOL,0},
  214.     {MN_BOL,0},
  215.     {MN_IGN,0}
  216. };
  217.  
  218. char    *PoParms[] = {
  219.     "Change name",
  220.     "Change size",
  221.     "Genome type",
  222.     "Environment parameters",
  223.     "Report parameters",
  224.     "Exit",
  225.     NULL
  226. };
  227.  
  228. struct VDisp PoVals[] = {
  229.     {MN_STR,0},
  230.     {MN_INT,0},
  231.     {MN_STR,0},
  232.     {MN_IGN,0},
  233.     {MN_IGN,0},
  234.     {MN_IGN,0}
  235. };
  236.  
  237. char    *Flags[] = {
  238.     "Init type",
  239.     "Selection method",
  240.     "Crossover",
  241.     "Crowding",
  242.     "Mutation",
  243.     "Pre-mutate",
  244.     "Elitism",
  245.     "Dump worst",
  246.     "Init dumped",
  247.     "Newbies",
  248.     "Erase best",
  249.     "Make stats",
  250.     "Exit",
  251.     NULL
  252. };
  253.  
  254. char    *FlagTags[] = {
  255.     "EVL_Evaluator",
  256.     "EVL_Select",
  257.     "EVL_Crosser",
  258.     "EVL_Crowding",
  259.     "EVL_Mutator",
  260.     "EVL_PreMutate",
  261.     "EVL_Elite",
  262.     "EVL_Dump",
  263.     "EVL_InitDumped",
  264.     "EVL_Newbies",
  265.     "EVL_EraseBest",
  266.     "EVL_Stats"
  267. };
  268.  
  269. struct VDisp FlagVals[] = {
  270.     {MN_STR,0},
  271.     {MN_STR,0},
  272.     {MN_STR,0},
  273.     {MN_BOL,0},
  274.     {MN_BOL,0},
  275.     {MN_BOL,0},
  276.     {MN_INT,0},
  277.     {MN_INT,0},
  278.     {MN_BOL,0},
  279.     {MN_INT,0},
  280.     {MN_BOL,0},
  281.     {MN_BOL,0},
  282.     {MN_IGN,0}
  283. };
  284.  
  285. char    *RFlagMenu[] = {
  286.     "Average",
  287.     "Median",
  288.     "Typecount",
  289.     "Max",
  290.     "Min",
  291.     "Standard Deviation",
  292.     "Toggle All",
  293.     "Runs to average",
  294.     "Exit",
  295.     NULL
  296. };
  297.  
  298. struct VDisp RFlagVals[] = {
  299.     {MN_BOL,0},
  300.     {MN_BOL,0},
  301.     {MN_BOL,0},
  302.     {MN_BOL,0},
  303.     {MN_BOL,0},
  304.     {MN_BOL,0},
  305.     {MN_IGN,0},
  306.     {MN_INT,0},
  307.     {MN_IGN,0}
  308. };
  309.  
  310. struct NPop {
  311.     char    *Name;
  312.     int    Size;
  313.     int    Type;
  314.     int    Flags[12];
  315.     int    RFlags[6];
  316. };
  317.  
  318. struct {
  319.     char    *Name;
  320.     int    NumPops,CLevel;
  321.     struct NPop *Pops;
  322.     int rep,sep,flags,pass;
  323. } Project;
  324.  
  325. char    *MOTD;
  326.  
  327. int    mcount(char **);
  328.  
  329. int    menu(char *,char **,struct VDisp *);
  330. int    msg(char *);
  331. int    int_query(char *,int);
  332. char *str_query(char *,char *);
  333. int    bool_query(char *,int);
  334. void    save_template(char *);
  335. void    load_template(char *);
  336. void    save_pop(FILE *,struct NPop);
  337. void    load_pop(FILE *,int);
  338. void    create_project(char *);
  339. char *addpart(char *,char *);
  340. void filtdump(FILE *,char *,int);
  341. int    file_write(char *);
  342.  
  343.  
  344. int main(int cnt,char *arg[])
  345. {
  346. char    z,buf[255],*tmenu[16],*p;
  347. int    i,n;
  348.  
  349. InitRand(time(NULL));
  350.  
  351. Project.Name=malloc(strlen(DEF_NAME)+1);
  352. strcpy(Project.Name,DEF_NAME);
  353. Project.NumPops=1;
  354. Project.Pops = NULL;
  355. Project.CLevel = 1;
  356. PrVals[0].Val = (long)Project.Name;
  357. PrVals[1].Val = 1;
  358. PrVals[2].Val = (long)CLNames[1];
  359. PrVals[3].Val = 0;
  360. Project.sep=0;
  361. Project.Pops = malloc(sizeof(struct NPop));
  362. memset(Project.Pops,0,sizeof(struct NPop));
  363. Project.Pops[0].Name = malloc(10);
  364. strcpy(Project.Pops[0].Name,"Polyphant");
  365. Project.Pops[0].Flags[4] = 1;    /* Do mutate */
  366. Project.Pops[0].Size = 20;
  367. Project.flags=0;
  368. Project.pass=1;
  369.  
  370. MOTD = malloc(1024);
  371.  
  372. strcpy(MOTD,"Welcome.");
  373.  
  374. switch(cnt) {
  375. case    1:
  376.     z=msg(CLEAR "\nWelcome! This is the GAP Conjurer.\n\nConjure a skeleton? " DEFY " : ");
  377. break;
  378.  
  379. case    2:
  380.     if(strcmp(arg[1],"-h") || strcmp(arg[1],"--help")) {
  381.         fprintf(stderr,"%s [Template] [Dest. Dir]\n",arg[0]);
  382.         goto tixE;
  383.     }
  384.     load_template(arg[1]);
  385.     z = 1;
  386. break;
  387.  
  388. case    3:
  389.     load_template(arg[1]);
  390.     create_project(arg[2]);
  391.     goto tixE;
  392. break;
  393.  
  394. default:
  395.     fprintf(stderr,"%s [Template] [Dest. Dir]\n",arg[0]);
  396.     goto tixE;
  397. }
  398.  
  399. if(toupper(z)!=NO) {
  400.     do {
  401.         i=menu("Main Menu",Menu1,NULL);
  402.         switch(i) {
  403.         case    1:
  404.             do {
  405.                 i = menu("Project parameters",PrParms,PrVals);
  406.                 switch(i) {
  407.                 case    1:    /* Project Name */
  408.                     free(Project.Name);
  409.                     Project.Name = str_query("Project name [" DEF_NAME "] ?",DEF_NAME);
  410.                     PrVals[0].Val = (long)Project.Name;
  411.                     sprintf(MOTD,"Project name is now %s.",Project.Name);
  412.                 break;
  413.  
  414.                 case    2:    /* # of pops */
  415.                     i = int_query("How many populations in project [1] ?",1);
  416.                     if(i>0) {
  417.                         for(n=0;n!=Project.NumPops;n++) {
  418.                             if(Project.Pops[n].Name!=NULL) {
  419.                                 free(Project.Pops[n].Name);
  420.                             }
  421.                         }
  422.                         Project.NumPops = i;
  423.                         PrVals[1].Val = Project.NumPops;
  424.                         if(Project.Pops!=NULL) free(Project.Pops);
  425.                         Project.Pops = malloc(Project.NumPops*sizeof(struct NPop));
  426.                         memset(Project.Pops,0,Project.NumPops*sizeof(struct NPop));
  427.                         n=Rnd(NUM_DEFNAMES);
  428.                         for(i=0;i!=Project.NumPops;i++) {
  429.                             sprintf(buf,"Name for population #%d [%s]? :",i,DefNames[(i+n)%NUM_DEFNAMES]);
  430.                             Project.Pops[i].Name = str_query(buf,DefNames[(i+n)%NUM_DEFNAMES]);
  431.                             Project.Pops[i].Flags[4] = 1;    /* Do mutate */
  432.                             Project.Pops[i].Size = 20;
  433.                         }
  434.                     }
  435.                     sprintf(MOTD,"%d populations created.",Project.NumPops);
  436.                 break;
  437.  
  438.                 case    3:    /* Comment level */
  439.                     Project.CLevel = menu("Comment level",CLMenu,NULL)-1;
  440.                     PrVals[2].Val = (long)CLNames[Project.CLevel];
  441.                     sprintf(MOTD,"Comment level set to %s.",CLNames[Project.CLevel]);
  442.                 break;
  443.  
  444.                 case    4:
  445.                     Project.sep^=1;
  446.                     PrVals[3].Val^=1;
  447.                 break;
  448.  
  449.                 case    5:
  450.                     Project.flags ^= WIZFLG_PLOT;
  451.                     PrVals[4].Val = Project.flags&WIZFLG_PLOT;
  452.                 break;
  453.  
  454.                 case    6:
  455.                     Project.flags ^= WIZFLG_PSPLOT;
  456.                     PrVals[5].Val = Project.flags&WIZFLG_PSPLOT;
  457.                 break;
  458.  
  459.                 }
  460.             } while(i!=mcount(PrParms));
  461.             i=1;
  462.         break;
  463.  
  464.         case    2:    /* Pop params */
  465.             if(Project.NumPops>0) {
  466.                 do {
  467.                     if(Project.NumPops>1) {
  468.                         for(i=0;i!=Project.NumPops;i++) {
  469.                             tmenu[i] = Project.Pops[i].Name;
  470.                         }
  471.                         tmenu[i] = "Exit";
  472.                         tmenu[i+1] = 0;
  473.                         n = menu("Select Population",tmenu,NULL)-1;
  474.                         if(n==(mcount(tmenu)-1)) {
  475.                             break;
  476.                         }
  477.                     } else {
  478.                         n = 0;
  479.                     }
  480.                     PoVals[0].Val = (long)Project.Pops[n].Name;
  481.                     PoVals[1].Val = Project.Pops[n].Size;
  482.                     PoVals[2].Val = (long)GenomeNames[Project.Pops[n].Type];
  483.                     do {
  484.                         sprintf(buf,"Parameters for %s population",Project.Pops[n].